package orderOpe;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import common.Cart;
import common.Item;


public class OrderCheckServlet extends HttpServlet {

	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		//入力項目を受け取り、エラーメッセージ格納用の箱を用意する
		String[] code = req.getParameterValues("code");
		String[] orders = req.getParameterValues("orders");
		String msg ="";
		String msg_stock = "";
		String[] msg_code = new String[10];
		boolean code_error = false;
		
		//パラメータを受け取る																											
		//商品コード																										
		//数量																										
		//※最大10個
		HttpSession session = req.getSession( );
		Cart cart = (Cart)session.getAttribute("opecart");
		
		//カートをクリアする
		cart.clear();
		
		//パラメータをチェックする																											
		//商品コードをチェックする	
		
		//数値以外をエラーにする
		Pattern p = Pattern.compile("[0-9]{1,4}");
		int cu=0;
		for(int i=0; i<10; i++){
			String c = (code.length > i) ? code[i] : null;
			String q =(orders.length>i)? orders[i]:null; 
			
			if((c ==null || c.length()==0) && (q ==null || q.length()==0)){
				cu++;
			}
			//数量が範囲外の場合はエラーメッセージをセットして受注エントリー画面へ遷移する
			else if(c == null  || c.length()==0){ 
				msg ="コード情報が入力されていません";
			}
			else if(q == null || q.length()==0){
				msg ="数量が入力されていません";
			}
			else if(!p.matcher(q).matches()){
				msg = "入力数を確認してください";
			}
			
			else{
				//商品情報を検索して、存在しなければエラーメッセージをセットして受注エントリー画面へ遷移する
				Item item=Item.find_by_code(c);
				if(item == null){
					msg_code[i]="未登録の商品コードです";
					code_error = true;
				}

			}
		}
		//まったく入力されてなかったときに表示
		if(cu == 10){
			msg="数値を入力してください";
		}
		
		//在庫と注文数を照らし合わせるためのマップを作る
		Map<String,Integer> map = new HashMap<String,Integer>();
		if ( msg.length() == 0 && !code_error ) {	
			for(int i=0; i<10; i++){
				String c = (code.length >i) ? code[i] : null;
				String q =(orders.length>i)? orders[i]:null; 
				if((c != null && c.length() > 0) && (q != null && q.length() > 0)){
					Integer s =map.get(c);
					Integer d =new Integer(q);
					if(s!=null){
						d=d+s;
					}
					map.put(c, d);
				}
			}
			// イテレータ：キーと値をループ
			for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
			    // entryを取得
			    Map.Entry<String, Integer> entry = it.next();
			    // キーを取得
			    String key = entry.getKey();
			    // 値を取得
			    Integer val = entry.getValue();
				Item item=Item.find_by_code(key);
			    int stock =item.getStock();
			    //合計注文数が在庫を超えたらエラー
			    if(stock<val){
			    	msg_stock = "在庫が足りません";
			    }
			}
		}
		
		if ( msg.length() == 0 && !code_error &&msg_stock.length() == 0) {
			for(int i=0; i<10; i++){
				String c = (code.length > i) ? code[i] : null;
				String q =(orders.length>i)? orders[i]:null;
				//商品コードまたは数量がセットされていない場合はエラーメッセージをセットして受注エントリー画面へ遷移する
				if((c ==null|| c.length()==0) && (q ==null || q.length()==0)){
					
				}
				else if(c == null || q == null){
				}
				else{
					int qu = Integer.parseInt(q);
					//カートに受注内容をカートに追加する																											
					//すべての受注商品について処理する
					if(qu>0){
					cart.add(c,qu);
					}
				}
			}	
			//確認画面へ遷移する
			resp.sendRedirect(req.getContextPath() + "/operator/orderCheck.jsp");
		}
		else {
			req.setAttribute("msg", msg.toString());
			req.setAttribute("msg_code", msg_code);
			req.setAttribute("msg_stock", msg_stock);
			RequestDispatcher dispatcher = 
					req.getRequestDispatcher("/operator/order_Input.jsp");
			dispatcher.forward(req, resp);
		}
	}
}

